import {
    getNewCart,
    mergeCart,
    findCart,
    addCart,
    deleteCart,
    updateCart,
    checkAllCart
} from '@/api/cart'
// 购物车状态
export default {
    namespaced: true,
    state: () => {
        return {
            list: []
        }
    },
    getters: {
        // 有效商品列表
        validList(state) {
            // 有效商品：stock 库存大于0，且商品有效
            return state.list.filter(goods => goods.stock > 0 && goods.isEffective)
        },
        // 有效商品总件数
        validTotal(state, getters) {
            return getters.validList.reduce((p, c) => p + c.count, 0)
        },
        // 有效商品总金额
        validAmount(state, getters) {
            // return getters.validList.reduce((p, c) => p + c.nowPrice * 100 * c.count, 0) / 100
            return getters.validList.reduce((p, c) => p + Math.round(c.nowPrice * 100) * c.count, 0) / 100
        },
        // 无效商品列表
        inValidList(state) {
            return state.list.filter(goods => goods.stock <= 0 && !goods.isEffective)
        },
        // 已选商品列表
        selectedList(state, getters) {
            return getters.validList.filter(item => item.selected)
        },
        // 已选商品总件数
        selectedTotals(state, getters) {
            return getters.selectedList.reduce((p, c) => p + c.count, 0)
        },
        // 已选商品总金额
        selectedAmount(state, getters) {
            return (
                getters.selectedList.reduce((p, c) => p + Math.round(c.nowPrice * 100) * c.count, 0) / 100
            )
        },
        // 是否全选
        isCheckAll(state, getters) {
            return (
                getters.selectedList.length !== 0 &&
                getters.selectedList.length === getters.validList.length
            )
        }
    },
    mutations: {
        // 加入购物车
        ADDSHOPPINGCART(state, payload) {
            // 约定字段
            // id name attrsText picture price nowPrice selected stock count isEffective
            // 插入数据的规则
            // 1.先找下是否有相同的商品
            // 2.如果有相同商品，查询他的数量，累加到payload中，在保存最新的位置，原来的商品需要删除
            // 3.如果没有相同商品
            const sameIndex = state.list.findIndex(goods => goods.skuId === payload.skuId)
            if (sameIndex > -1) {
                const count = state.list[sameIndex].count
                payload.count += count
                    // 删除原来的
                state.list.splice(sameIndex, 1)
            }
            // 追加新的
            state.list.unshift(payload)
            console.log('mutations', payload, state.list)
        },
        // 修改购物车
        UPDATECART(state, goods) {
            // goods 商品信息：nowPrice stock isEffective
            // goods 商品对象字段不固定，对象中有哪些字段就修改哪些字段，字段的值合理才改
            // goods 商品对象必须要有skuid

            const updateGoods = state.list.find(item => item.skuId === goods.skuId)
            for (const k in goods) {
                if (goods[k] !== undefined && goods[k] !== null && goods[k] !== '') {
                    updateGoods[k] = goods[k]
                }
            }
        },
        // 删除购物车商品
        DELETECART(state, skuId) {
            const index = state.list.findIndex(item => item.id === skuId)
            state.list.splice(index, 1)
        },
        // 设置购物车
        SETCART(state, payload) {
            state.list = payload
        }
    },
    actions: {
        addShoppingCart(context, payload) {
            return new Promise((resolve, reject) => {
                if (context.rootState.user.profile.token) {
                    // 已登录
                    addCart({ skuId: payload.skuId, count: payload.count })
                        .then(() => {
                            return findCart()
                        })
                        .then(data => {
                            context.commit('SETCART', data.result)
                            resolve()
                        })
                } else {
                    // 未登录
                    context.commit('ADDSHOPPINGCART', payload)
                    resolve()
                }
            })
        },
        // 获取购物车
        findCart(context, payload) {
            return new Promise((resolve, reject) => {
                if (context.rootState.user.profile.token) {
                    // 已登录
                    findCart().then(data => {
                        context.commit('SETCART', data.result)
                        resolve()
                    })
                } else {
                    // 未登录
                    // 同时发送请求（有几个商品发送几个请求）等所有请求成功，一并去修改本地数据
                    const promiseArr = context.state.list.map(goods => {
                        console.log('--------', goods)
                        return getNewCart(goods.skuId)
                    })
                    Promise.all(promiseArr).then(result => {
                        // 更新本地购物车
                        result.forEach((item, i) => {
                            context.commit('UPDATECART', {
                                skuId: context.state.list[i].skuId,
                                ...item.result
                            })
                        })
                        resolve()
                    })
                }
            })
        },
        // 删除购物车
        deleteCart: function(context, payload) {
            return new Promise((resolve, reject) => {
                if (context.rootState.user.profile.token) {
                    // 已登录
                    deleteCart([payload])
                        .then(() => {
                            return findCart()
                        })
                        .then(data => {
                            context.commit('SETCART', data.result)
                            resolve()
                        })
                } else {
                    // 未登录
                    context.commit('DELETECART', payload)
                    resolve()
                }
            })
        },
        // 修改购物车，数量 状态
        updateCart(context, payload) {
            // payload 需要 :必须skuId 可能需要selected count
            return new Promise((resolve, reject) => {
                if (context.rootState.user.profile.token) {
                    // 已登录
                    updateCart(payload)
                        .then(() => {
                            return findCart()
                        })
                        .then(data => {
                            context.commit('SETCART', data.result)
                            resolve()
                        })
                } else {
                    // 未登录
                    context.commit('UPDATECART', payload)
                    resolve()
                }
            })
        },
        // 全选
        checkAllCart(context, selected) {
            return new Promise((resolve, reject) => {
                if (context.rootState.user.profile.token) {
                    // 已登录
                    const ids = context.getters.validList.map(item => item.skuId)
                    checkAllCart({ selected, ids })
                        .then(() => {
                            return findCart()
                        })
                        .then(data => {
                            context.commit('SETCART', data.result)
                            resolve()
                        })
                } else {
                    // 未登录
                    context.getters.validList.forEach(goods => {
                        context.commit('UPDATECART', { skuId: goods.skuId, selected })
                    })
                    resolve()
                }
            })
        },
        // 批量删除
        batchDeleteCart(context, isClear) {
            return new Promise((resolve, reject) => {
                if (context.rootState.user.profile.token) {
                    // 已登录
                    const ids = context.getters[isClear ? 'inValidList' : 'selectedList'].map(
                        item => item.skuId
                    )
                    console.log(ids)
                    deleteCart(ids)
                        .then(() => {
                            return findCart()
                        })
                        .then(data => {
                            context.commit('SETCART', data.result)
                            resolve()
                        })
                } else {
                    // 未登录
                    // 找出选中的商品列表,遍历调用删除的mutations
                    // isClear = true 删除失效列表 否则为删除选中的购物车商品
                    context.getters[isClear ? 'inValidList' : 'selectedList'].forEach(item => {
                        context.commit('DELETECART', item.id)
                    })
                    resolve()
                }
            })
        },
        // 修改规格
        updateCartSku(context, { oldSkuId, newSku }) {
            return new Promise((resolve, reject) => {
                if (context.rootState.user.profile.token) {
                    // 已登录
                    // 1.找出旧的商品信息
                    // 2.删除旧的商品
                    // 3.原先旧的数量+新的skuId
                    // 4.添加新的商品
                    const oldGoods = context.state.list.find(item => item.skuId === oldSkuId)
                    deleteCart([oldGoods.skuId])
                        .then(() => {
                            return addCart({ skuId: newSku.skuId, count: oldGoods.count })
                        })
                        .then(() => {
                            return findCart()
                        })
                        .then(data => {
                            context.commit('SETCART', data.result)
                            resolve()
                        })
                } else {
                    // 未登录
                    // 1.找出旧的商品信息
                    // 2.删除旧的商品
                    // 3.根据新的sku信息和旧的商品信息,合并成新的购物车商品数据
                    // 4.添加新的商品
                    const oldGoods = context.state.list.find(item => item.skuId === oldSkuId)
                    context.commit('DELETECART', oldSkuId)
                    const { skuId, price: nowPrice, specsText: attrsText, inventory: stock } = newSku
                    const newGoods = {...oldGoods, skuId, nowPrice, attrsText, stock }
                    context.commit('ADDSHOPPINGCART', newGoods)
                    resolve()
                }
            })
        },
        // 合并购物车
        async mergeCart(context) {
            // 准备合并参数
            const cartList = context.state.list.map(item => {
                return {
                    skuId: item.skuId,
                    selected: item.selected,
                    count: item.count
                }
            })
            await mergeCart(cartList)
                // 合并清空购物车
            context.commit('SETCART', [])
        }
    }
}